package org.farec.tcc.spring.controller;

import java.sql.Connection;
import java.sql.SQLException;
import java.text.ParseException;

import java.util.ArrayList;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.farec.tcc.dao.AreaDAO;
import org.farec.tcc.dao.CategoriaDAO;
import org.farec.tcc.dao.ClienteDAO;
import org.farec.tcc.dao.FaqDAO;
import org.farec.tcc.dao.GrupoDAO;
import org.farec.tcc.dao.IncidenteDAO;
import org.farec.tcc.dao.LocalDAO;
import org.farec.tcc.dao.OutrosDAO;
import org.farec.tcc.dao.PermissaoDAO;
import org.farec.tcc.dao.SolicitacaoDAO;
import org.farec.tcc.dao.UnidadeDAO;
import org.farec.tcc.dao.UsuarioDAO;
import org.farec.tcc.modelo.Grupo;
import org.farec.tcc.modelo.Ocorrencia;
import org.farec.tcc.modelo.Ocorrencia_Historico;
import org.farec.tcc.modelo.Permissao;
import org.farec.tcc.modelo.Usuario;
import org.farec.tcc.spring.adapter.Calendario;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SolicitacaoController {
		
	@RequestMapping("/formSolicitacao")
	public String formSolicitacao(HttpServletRequest request, Model model)
	{		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação") && p.getItem().equals("adicionar"))
			{
				String[] prioridades = {"Alta","Normal","Baixa"};
				List<Ocorrencia> ocorrenciaList = new ArrayList<>();
				
				for(String str : prioridades)
				{
					Ocorrencia ocorrencia = new Ocorrencia();
					ocorrencia.setPrioridade(str);
					ocorrenciaList.add(ocorrencia);
				}
			
				AreaDAO areaDAO = new AreaDAO(connection);
				CategoriaDAO categoriaDAO = new CategoriaDAO(connection);
				ClienteDAO clienteDAO = new ClienteDAO(connection);
				LocalDAO localDAO = new LocalDAO(connection);
				UnidadeDAO unidadeDAO = new UnidadeDAO(connection);
				
				model.addAttribute("areas", areaDAO.getLista(codEmpresa, "nome"));
				model.addAttribute("categorias", categoriaDAO.getLista(codEmpresa));
				model.addAttribute("clientes", clienteDAO.getListaNomeCliente(codEmpresa));
				model.addAttribute("solicitacoes", ocorrenciaList);
				model.addAttribute("locais", localDAO.getLista(codEmpresa));
				model.addAttribute("unidades", unidadeDAO.getLista(codEmpresa));

				return "cadsolicitacao";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/adicionarSolicitacao")
	public String adiciona(Ocorrencia ocorrencia,  HttpServletRequest request, String dt) throws SQLException,ParseException
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação") && p.getItem().equals("adicionar"))
			{
				ocorrencia.setDataAbertura(new Calendario().getData(dt));
				ocorrencia.setCodEmpresa(codEmpresa);
				ocorrencia.setTipo("solicitacao");
				
				SolicitacaoDAO dao = new SolicitacaoDAO(connection);
				dao.adiciona(ocorrencia);
				return "redirect:listaSolicitacao";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/listaSolicitacao")
	public String lista(String[] status, Model model, HttpServletRequest request)
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação") && p.getItem().equals("visualizar"))
			{
				
			
				IncidenteDAO daoIncidente = new IncidenteDAO(connection);
				SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
				OutrosDAO daoOutros = new OutrosDAO(connection);
				GrupoDAO daoGrupo = new GrupoDAO(connection);
				
				String[] status2 = {"Aberto","Andamento","Concluído"};
				Map<String,Boolean> statusMap = new HashMap<>();
				
				usuario.setCodEmpresa(codEmpresa);
				
				//Obtem o grupo
				Grupo grupo = new Grupo();
				grupo = daoGrupo.getGrupoPorID(usuario.getCodGrupo(), codEmpresa);
				usuario.setGrupo(grupo.getNome());
				
				if(status != null)
				{
					for(String str : status2)
					{
						statusMap.put(str, false);
					}
					
					List<Ocorrencia> lista = daoSolicitacao.getFiltro2(codEmpresa, status);
	
					for(Ocorrencia ocorrencia : lista)
					{
						String key = ocorrencia.getStatus();
						statusMap.put(key,true);
					}
					
					session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
					session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
					session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
					
					model.addAttribute("permissoesList", permissaoList);
					model.addAttribute("solicitacoes", daoSolicitacao.getFiltro(status, usuario));
					model.addAttribute("statusMap", statusMap);
					
					return "solicitacao";
	
				}
				
				for(String str : status2)
				{
					statusMap.put(str, true);
				}
				
				session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
				session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
				session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
				
				model.addAttribute("permissoesList", permissaoList);
				model.addAttribute("solicitacoes", daoSolicitacao.getLista(usuario));
				model.addAttribute("statusMap", statusMap);
				return "solicitacao";
			}
			
		}
	
		return "index";	
		
	}
	
	@RequestMapping("/exibeSolicitacao")
	public String mostra(int id, Model model, HttpServletRequest request) throws SQLException 
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação") && p.getItem().equals("alterar"))
			{
				String[] prioridades = {"Alta","Normal","Baixa"};
				List<Ocorrencia> ocorrenciaList = new ArrayList<>();
				
				for(String str : prioridades)
				{
					Ocorrencia ocorrencia = new Ocorrencia();
					ocorrencia.setPrioridade(str);
					ocorrenciaList.add(ocorrencia);
				}
				
				SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
				AreaDAO daoArea = new AreaDAO(connection);
				CategoriaDAO daoCategoria = new CategoriaDAO(connection);
				ClienteDAO daoCliente = new ClienteDAO(connection);
				UnidadeDAO daoUnidade = new UnidadeDAO(connection);
				LocalDAO daoLocal = new LocalDAO(connection);
				
				model.addAttribute("solicitacao", daoSolicitacao.buscaPorCodigo(id));
				model.addAttribute("solicitacoes", ocorrenciaList);
				model.addAttribute("areas", daoArea.getLista(codEmpresa, "nome"));
				model.addAttribute("categorias", daoCategoria.getLista(codEmpresa));
				model.addAttribute("clientes", daoCliente.getLista(codEmpresa));
				model.addAttribute("unidades", daoUnidade.getLista(codEmpresa));
				model.addAttribute("locais", daoLocal.getLista(codEmpresa));
				
				return "editsolicitacao";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/alterarSolicitacao")
	public String altera(Ocorrencia ocorrencia, HttpServletRequest request, String dt) throws SQLException,ParseException
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação") && p.getItem().equals("alterar"))
			{
				ocorrencia.setDataAbertura(new Calendario().getData(dt));
				ocorrencia.setCodEmpresa(codEmpresa);
				
				SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
				daoSolicitacao.altera(ocorrencia);
				return "redirect:listaSolicitacao";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/removeSolicitacao")
	public String remove(Ocorrencia ocorrencia, HttpServletRequest request)
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação") && p.getItem().equals("alterar"))
			{
				ocorrencia.setCodEmpresa(codEmpresa);
				
				SolicitacaoDAO dao = new SolicitacaoDAO(connection);
				dao.remove(ocorrencia);
				return "redirect:listaSolicitacao";
			}
		}
		
		return "index";
	}
	
	//Metodos referentes ao historico da solicitacao
	
	@RequestMapping("/fecharSolicitacao")
	public String fecharSolicitacao(int id, Model model, HttpServletRequest request)
	{		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação"))
			{
				SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
				FaqDAO daoFaq = new FaqDAO(connection);
				
				model.addAttribute("solicitacoes", daoSolicitacao.buscaPorCodigo(id));
				model.addAttribute("faqs", daoFaq.getLista(codEmpresa));
				
				return "fecharsolicitacao";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/adicionaHistoricoSolicitacao")
	public String adicionaHistorico(int codigoSolicitacao, String descricaoSolicitacao,  HttpServletRequest request) throws ParseException
	{
		//Obtem o usuario logado
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		
		Ocorrencia ocorrencia = new Ocorrencia();
		Ocorrencia_Historico historico = new Ocorrencia_Historico();
		
		historico.setDataHistorico(new Calendario().getData(new Calendario().getDataAtual()));
		
		//Setters  de Ocorrencia
		ocorrencia.setStatus("Andamento");
				
		//Setters do historico da ocorrencia
		historico.setCodigoOcorrencia(codigoSolicitacao);
		historico.setDescricao(descricaoSolicitacao);
		historico.setUsuario(usuario.getUsuario());
			
		Connection connection = (Connection) request.getAttribute("conexao");
			
		SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
		daoSolicitacao.adicionaHistorico(ocorrencia, historico);
		
		return "redirect:exibeHistoricoSolicitacao?id="+codigoSolicitacao;
		
	}
	
	@RequestMapping("/exibeHistoricoSolicitacao")
	public String mostraHistorico(int id, Model model, HttpServletRequest request) throws SQLException 
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Solicitação"))
			{
				SolicitacaoDAO solicitacaoDAO = new SolicitacaoDAO(connection);
				
				model.addAttribute("historicoSolicitacoes", solicitacaoDAO.getHistorico(id));
				model.addAttribute("solicitacoes", solicitacaoDAO.buscaPorCodigo(id));
					
				return "historicosolicitacao";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/finalizarSolicitacao")
	public String finalizar(int codigoSolicitacao, String descricaoSolicitacao, String status, String situacaoSolicitacao,  String faq, HttpServletRequest request) throws ParseException
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		//Obtem o usuario logado
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		
		
		
		Ocorrencia ocorrencia = new Ocorrencia();
		Ocorrencia_Historico historico = new Ocorrencia_Historico();
		
		//Montando o calendario e setando os valores das datas
		historico.setDataHistorico(new Calendario().getData(new Calendario().getDataAtual()));
		ocorrencia.setDataFechamento(new Calendario().getData(new Calendario().getDataAtual()));
		ocorrencia.setCodigo(codigoSolicitacao);
		ocorrencia.setSituacao(situacaoSolicitacao);	
		ocorrencia.setFaq(faq);

		//Setters do historico da ocorrencia
		historico.setDescricao(descricaoSolicitacao);
		historico.setUsuario(usuario.getUsuario());
			
		IncidenteDAO daoIncidente = new IncidenteDAO(connection);
		SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
		OutrosDAO daoOutros = new OutrosDAO(connection);
		
		ocorrencia.setCodEmpresa(codEmpresa);
		
		if(status.equals("Andamento")) //Executa se a situacao foi encaminhada
		{
			ocorrencia.setSituacao("aprovado");
			ocorrencia.setStatus("Concluído");
			daoSolicitacao.fecharSolicitacao(ocorrencia, historico);
			return "redirect:listaSolicitacao";
		}
		
		else
			if(situacaoSolicitacao.equals("reprovado"))
			{
				
				session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
				session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
				session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
				
				ocorrencia.setStatus("Concluído");
				daoSolicitacao.fecharSolicitacao(ocorrencia, historico);
				return "redirect:listaSolicitacao";
			}
		
		ocorrencia.setStatus("Andamento");
		daoSolicitacao.analiseSolicitacao(ocorrencia, historico);
		
		session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
		session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
		session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
		
		return "redirect:listaSolicitacao";
		
	}
}
